package com.artisan.springuitls.demos;

import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

/**
 * ObjectUtils 工具类演示
 * 功能：对象安全操作卫士
 * 优势：支持数组、集合，无 NullPointerException 风险
 */
@Component
public class ObjectUtilsDemo {

    /**
     * 场景：日志打印对象（安全处理 null）
     */
    public void logUserInfo(User user) {
        System.out.println("\n========== ObjectUtils Demo ==========");
        
        // ✅ 安全打印：user 为 null 时返回 "null"
        System.out.println("用户信息: " + ObjectUtils.nullSafeToString(user));
        
        // 💡 扩展：获取安全哈希码（避免 null）
        int safeHash = ObjectUtils.nullSafeHashCode(user);
        System.out.println("安全哈希: " + safeHash);
        
        // 数组安全打印
        String[] array = {"Java", "Spring", "Boot"};
        System.out.println("数组: " + ObjectUtils.nullSafeToString(array)); // [Java, Spring, Boot]
        
        // null 安全比较
        System.out.println("null 相等: " + ObjectUtils.nullSafeEquals(null, null)); // true
        System.out.println("对象相等: " + ObjectUtils.nullSafeEquals("test", "test")); // true
    }

    /**
     * 演示更多实用方法
     */
    public void demonstrateMoreMethods() {
        System.out.println("\n--- 对象检查操作 ---");
        
        // 判断对象是否为空
        System.out.println("null 是空: " + ObjectUtils.isEmpty(null)); // true
        System.out.println("空字符串是空: " + ObjectUtils.isEmpty("")); // true
        System.out.println("空数组是空: " + ObjectUtils.isEmpty(new String[0])); // true
        
        // 判断是否为数组
        System.out.println("是否为数组: " + ObjectUtils.isArray(new int[]{1, 2, 3})); // true
        
        // 获取对象的显示字符串（用于日志）
        User user = new User("张三", 25);
        System.out.println("显示字符串: " + ObjectUtils.getDisplayString(user));
        
        // 获取对象的身份标识（类名@哈希码）
        System.out.println("身份标识: " + ObjectUtils.identityToString(user));
        
        // 数组包含检查
        String[] array = {"Java", "Spring", "Boot"};
        System.out.println("包含 Spring: " + ObjectUtils.containsElement(array, "Spring")); // true
        
        // 添加元素到数组
        String[] newArray = ObjectUtils.addObjectToArray(array, "Cloud");
        System.out.println("新数组: " + ObjectUtils.nullSafeToString(newArray)); // [Java, Spring, Boot, Cloud]
        
        System.out.println("==========================================\n");
    }

    /**
     * 模拟 User 对象
     */
    public static class User {
        private String name;
        private Integer age;

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public Integer getAge() {
            return age;
        }

        @Override
        public String toString() {
            return "User{name='" + name + "', age=" + age + "}";
        }
    }
}

